/**
 * 扁平数组转为树形数组
 * @param {*} parentId 初始parentId
 * @param {*} list 初始数组
 * @param {*} childrenName 转化后子节点名称
 * @param {*} idName 节点id 字段名称
 * @param {*} parentIdName 节点父id字段名称
 * @returns 
 */
export function arrayListToTree(parentId, list, childrenName="children", idName="id", parentIdName="parentId") {
  let tree = []
  let arr = list
  arr.forEach(item => {
    if (item[parentIdName] === parentId) {
      if (arrayListToTree(item[idName], arr, childrenName, idName, parentIdName).length > 0) {
        // 递归如果存在children设置children
        item.hasChildren = true
        item[childrenName] = arrayListToTree(item[idName], arr, childrenName, idName, parentIdName)
      } else {
        item.hasChildren = false
      }
      // 取出最顶层的 放到一个新的数组中  
      tree.push(item)
    }
  })
  return tree
}

/**
 * 树形数组转为扁平数组
 * @param {*} arr 初始数组
 * @param {*} childrenName 子节点 字段名称
 * @returns 
 */
export function arrayTreeToList(arr, childrenName="children") {
  let result = []
  for (let item of arr) {
      var res = JSON.parse(JSON.stringify(item)) // 先克隆一份数据作为第一层级的填充
      delete res[childrenName]
      result.push(res)
      if (item[childrenName] instanceof Array && item[childrenName] && item[childrenName].length > 0) { // 如果当前child为数组并且长度大于0，才可进入
          result = result.concat(arrayTreeToList(item[childrenName], childrenName))
      }
  }
  return result
}

/**
 * 数组去重
 * @export
 * @param {*} arr
 * @returns
 */
export function arrayUnique(arr) {
  return Array.from(new Set(arr))
}

/**
 * 数组交集
 * @export
 * @param {*} arr1
 * @param {*} arr2
 * @returns
 */
export function arrayIntersection(arr1, arr2) {
  return arr1.filter(item => arr2.includes(item))
}

/**
 * 数组并集
 * @export
 * @param {*} arr1
 * @param {*} arr2
 * @returns
 */
export function arrayUnion(arr1, arr2) {
  return [...new Set([...arr1,...arr2])]
}

/**
 * 数据差集
 * @export
 * @param {*} arr1
 * @param {*} arr2
 * @returns
 */
export function arrayDiffer(arr1, arr2) {
  return arr1.filter(item => !arr2.includes(item))
}
